package org.sun.basic.dao;

import java.util.List;
import java.util.Map;

import org.sun.basic.model.Pager;

public interface IBaseDao<T> {
 
	/**
	 * 添加
	 * @param t
	 * @return
	 */
	public T add(T t);
	/**
	 * 更新
	 * @param t
	 */
	public void update(T t);
	/**
	 * 删除
	 * @param t
	 */
	public void delete(String id);
	/**
	 * 查询
	 * @param t
	 * @return
	 */
	public T load(String id);
	/**
	 * 不分页查询
	 * @param hql
	 * @param args
	 * @return
	 */
	public List<T> list(String hql,Object[] args);
	public List<T> list(String hql,Object arg);
	public List<T> list(String hql);
	/**
	 * 基于别名的查询
	 * @param hql
	 * @param args
	 * @param alias 别名对象
	 * @return
	 */
	public List<T> list(String hql,Object[] args,Map<String,Object> alias);
	public List<T> listByAlias(String hql,Map<String,Object> alias);
	
	/**
	 * 分页查询
	 * @param hql
	 * @param args
	 * @return
	 */
	public Pager<T> find(String hql,Object[] args);
	public Pager<T> find(String hql,Object arg);
	public Pager<T> find(String hql);
	/**
	 * 基于别名的查询
	 * @param hql
	 * @param args
	 * @param alias 别名对象
	 * @return
	 */
	public Pager<T> find(String hql,Object[] args,Map<String,Object> alias);
	public Pager<T> findByAlias(String hql,Map<String,Object> alias);
	
	/**
	 * 根据hql查询一组对象
	 * @param hql
	 * @param args
	 * @return
	 */
	public Object queryObject(String hql,Object[] args,Map<String ,Object> alias);
	public Object queryObjectByAlias(String hql,Map<String ,Object> alias);
	public Object queryObject(String hql,Object[] args);
	public Object queryObject(String hql,Object arg);
	public Object queryObject(String hql);
	public Object[] query(String sql,Object...args);
	public  List<Object[]> queryList(String sql,Object...args);
	
	/**
	 * 根据hql更新一组对象
	 * @param hql
	 * @param args
	 * @return
	 */
	public Object updateByHql(String hql,Object[] args);
	public Object updateByHql(String hql,Object arg);
	public Object updateByHql(String hql);
	
	/**
	 * 根据sql查询对象，不包含关联对象
	 * @param sql
	 * @param args
	 * @param clz 查询的实体对象
	 * @param hasEntity 该对象是否是一个hibernate管理的对象，如果不是需要使用setResultTransform查询
	 * @return 一组对象
	 */
	public List<Object> listBySql(String sql,Object[] args,Class<?> clz,boolean hasEntity);
	public List<Object> listBySql(String sql,Object arg,Class<?> clz,boolean hasEntity);
	public List<Object> listBySql(String sql,Class<Object> clz,boolean hasEntity);
	public List<Object> listBySql(String sql,Object[] args,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	public List<Object> listByAliasSql(String sql,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	
	/**
	 * 根据sql查询对象，不包含关联对象带分页的
	 * @param sql
	 * @param args
	 * @param clz 查询的实体对象
	 * @param hasEntity 该对象是否是一个hibernate管理的对象，如果不是需要使用setResultTransform查询
	 * @return 一组对象
	 */
	public Pager<Object> findBySql(String sql,Object[] args,Class<?> clz,boolean hasEntity);
	public Pager<Object> findBySql(String sql,Object arg,Class<?> clz,boolean hasEntity);
	public Pager<Object> findBySql(String sql,Class<?> clz,boolean hasEntity);
	public Pager<Object> findBySql(String sql,Object[] args,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	public Pager<Object> findByAliasSql(String sql,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	
	public void execution(String sql,Object...args);
}
